package com.itlong.cloud.user.property;

import com.itlong.cloud.POJO.DTO.property.PropertyRoleGetPageDTO;
import com.itlong.cloud.POJO.DTO.property.PropertyUserLoginDTO;
import com.itlong.cloud.POJO.PO.PropertyFunctionPO;
import com.itlong.cloud.POJO.PO.PropertyRolePO;
import com.itlong.cloud.POJO.VO.operate.OperateGetRoleMenuVO;
import com.itlong.cloud.POJO.VO.property.PropertyGetRoleUserVO;
import com.itlong.cloud.POJO.VO.property.PropertyParentFunctionVO;
import com.itlong.cloud.POJO.VO.property.PropertyRoleVO;
import com.itlong.cloud.utils.page.Page;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业-角色管理业务处理暴露接口
 * </desc>
 *
 * @createDate 2017/09/25
 */
@FeignClient(name = "user-service")
public interface IPropertyRoleServiceClient {


    /**
     * <desc>
     *      获取物业管理员角色 ：集团物业管理员，物业管理员，独立开发者
     * </desc>
     *
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/09
     */

    @RequestMapping(path = "/property/system/role/getRootRoles")
    List<PropertyRolePO> getRootRoles();

    /**
     * <desc>
     *      保存角色菜单
     * </desc>
     *
     * @param roleId 角色id
     * @param functionIds 资源id 多个,号分隔
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/09
     */

    @RequestMapping(path = "/property/system/role/saveRoleFunction")
    Integer saveRoleFunction(
            @RequestParam("roleId") String roleId,
            @RequestParam("functionIds") String functionIds,
            @RequestParam("projectId") String projectId,
            @RequestParam("propertyApp") String propertyApp) throws Exception;




    /**
     * <desc>
     *      获取分页列表
     * </desc>
     *
     * @param propertyRoleGetPageDTO 查询参数DTO
     * @return page模型
     * @author Biao.R
     * @createDate 2017/09/25
     */
    @RequestMapping(path = "/property/system/role/getPage")
    Page<PropertyRoleVO> getPage(@RequestBody PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;

    /**
     * <desc>
     *      保存角色
     * </desc>
     *
     * @param propertyRoleGetPageDTO 角色实体
     * @return sql执行行数
     * @author Biao.R
     * @createDate 2017/10/17
     */
    @RequestMapping(path = "/property/system/role/save")
    Integer save(@RequestBody PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;

    /**
     * <desc>
     *      更新角色
     * </desc>
     *
     * @param propertyRoleGetPageDTO 角色查询DTO
     * @return sql执行行数
     * @author Biao.R
     * @createDate 2017/10/17
     */
    @RequestMapping(path = "/property/system/role/update")
    Integer update(@RequestBody PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;

    /**
     * <desc>
     *      查询单个角色
     * </desc>
     *
     * @param propertyRolePO 角色实体
     * @return 角色实体
     * @author Biao.R
     * @createDate 2017/10/17
     */
    @RequestMapping(path = "/property/system/role/getOne")
    PropertyRolePO getOne(@RequestBody PropertyRolePO propertyRolePO);

    /**
     * <desc>
     *      删除角色
     * </desc>
     *
     * @param roleIds 角色id数组
     * @return sql执行行数
     * @author Biao.R
     * @createDate 2017/10/17
     */
    @RequestMapping(path = "/property/system/role/delete")
    Integer delete(@RequestParam("roleIds") String roleIds);

    /**
     * <desc>
     *       为角色分配人员
     * </desc>
     *
     * @param roleId    角色id
     * @param allotUsers    需要分配的人员id 多个，号分隔
     * @param userIds 当前列表所有人员id 多个，号分隔
     * @return sql执行行数
     * @author Biao.R
     * @createDate 2017/10/17
     */
    @RequestMapping(path = "/property/system/role/saveRoleUsers")
    Integer saveRoleUsers(
            @RequestParam("roleId") String roleId,
            @RequestParam("allotUsers") String allotUsers,
            @RequestParam("userIds") String userIds);

    /**
     * <desc>
     *       根据字段参数查询
     * </desc>
     *
     * @param params    查询参数
     * @return List<PropertyRolePO> 返回数据集合
     * @author Biao.R
     * @createDate 2017/10/17
     */
    @RequestMapping(path = "/property/system/role/getByFields")
    List<PropertyRolePO> getByFields(@RequestBody Map<String, Object> params);

    /**
     * <desc>
     *      点击左边菜单后，根据角色获取按钮权限
     * <desc/>
     * @param   propertyUserLoginDTO     物业用户登录DTO
     * @return  查找到的按钮数据集
     * @author Biao.R
     * @createDate 2017/10/12
     */
    @RequestMapping(path = "/property/system/role/getAuthBtns")
    List<OperateGetRoleMenuVO> getAuthBtns(@RequestBody PropertyUserLoginDTO propertyUserLoginDTO);

    /**
     * <desc>
     *      角色分配菜单按钮权限前，查询角色菜单和按钮
     *      角色的菜单权限不能超出物业管理员的菜单和按钮权限
     * <desc/>
     * @param   propertyRoleGetPageDTO  物业角色查询对象
     * @return  查找到的菜单数据集
     * @author Biao.R
     * @createDate 2017/10/26
     */
    @PostMapping(path = "/property/system/role/getRoleFunctions")
    List<PropertyParentFunctionVO> getRoleFunctions(@RequestBody PropertyRoleGetPageDTO propertyRoleGetPageDTO);


    /**
     * <desc>
     *      查询物业角色拥有的菜单及按钮权限
     * <desc/>
     * @param  propertyUserLoginDTO 登录DTO
     * @return    查询得到的菜单按钮VO
     * @author Biao.R
     * @createDate 2017/10/16
     */
    @PostMapping(path = "/property/system/role/getFunctions")
    List<OperateGetRoleMenuVO> getFunctions(@RequestBody PropertyUserLoginDTO propertyUserLoginDTO);

    /**
     * <desc>
     *      根据角色获取菜单按钮的信息
     * <desc/>
     * @param   roleId  当前项目的角色ID
     * @param   projectId  当前登录小区
     * @return  查询到的按钮信息
     * @author Biao.R
     * @createDate 2017/11/27
     */
    @PostMapping(path = "/property/system/role/getFunctionsByRole")
    List<PropertyFunctionPO> getFunctionsByRole(@RequestParam("roleId") String roleId, @RequestParam("projectId") String projectId);

    /**
     * <desc>
     *      通过component和roleId  反向获取对应菜单functionId
     * <desc/>
     * @param  identifier    操作对应的按钮标识
     * @return  该该按钮所在的菜单ID
     * @author Biao.R
     * @createDate 2017/11/30
     */
    @PostMapping(path = "/property/system/role/getFunctionIdByIdentifier")
    String getFunctionIdByIdentifier(@RequestParam("identifier")String identifier);

    /**
     * <desc>
     *      查询指定角色所有用户
     * </desc>
     *
     * @param projectId 项目id
     * @param roleId 角色id
     * @return 用户列表
     * @author wangzhi
     * @createDate 2018/08/15
     */
    @PostMapping(path = "/property/system/role/getRoleUsers")
    List<PropertyGetRoleUserVO> getRoleUser(@RequestParam("projectId") String projectId, @RequestParam("roleId") String roleId);

    /**
     * <desc>
     *      查询角色物业app字段
     * </desc>
     *
     * @author wangzhi
     * @createDate 2019/12/24
     */
    @PostMapping(path = "/property/system/role/getRolePropertyApp")
    String getRolePropertyApp(@RequestBody PropertyRoleGetPageDTO propertyRoleGetPageDTO) throws Exception;

}
